8
תגובות

עזרה עם ms-sql

פתח משתמש_214319 ,
אהלן התחלתי לעבוד עם pdo לphp שמאפשר עבודה מול mssql ..

בשונה מmy-sql הכל מסובך!

דבר ראשון לעשות load של מידע מקבצי csv/txt.. כאשר קבצי הtxt מקודדים כutf8 הכל עולה לDB כג'יבריש!

הקוליישן של הDB מוגדר latin1_CS_AS וכל תא שמכיל עברית נבנה כ NvarChar..

ועדיין אין עברית עד שלא שומרים מחדש את קבצי הטקסט כANSI ועושים LOAD מחדש..

זה תהליך מסורבל ולא עמיד בLOAD ששרתים עושים שהכל ישתבש

זה קטע הקוד

use[db]
BULK
INSERT test
FROM '123.txt'
WITH
(
DATAFILETYPE = 'char',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
CODEPAGE ='1255'            
)
GO


דבר שני..
אני מנסה להגדיר ללא הצלחה תאים כאינקדס KEY פשוט מה שMYSQL עובד פשוט וקל..
עוד דבר כל LIKE שאני מבצע לא תופס על עברית משום מה...


חייב את העזרה שלכם .. ושכל העולם יעבור כבר לDB אחד

יום טוב תודה רבה

8 תשובות

avatar ענה intval ב 14 למאי 2012 #

1. כמו שעלית על זה נכון, או שצריך לשמור את כל הקבצים ב ansi כדי שהקידוד שלהם יתאים ל collation של המסד, או לשנות את ה collation של המסד ל utf8 . שזה בלתי אפשרי, כיוון ש sql server עובד רק עם utf-16 (ואגב, לשדות מסוג nvarcha כבר מוגדר בצורה אוטומטית collation של utf-16)

ככה שבמילים פשוטות - אין שום דבר שאתה יכול לעשות חוץ מלהפוך את הקובץ ל utf-16 לפני שאתה מפעיל עליו את ה bulk insert


2. מה הפקודה שאתה מנסה להריץ?

CREATE INDEX idx1 ON tablename(columnname);

אינדקס פרימיטיבי פשוט, לא מפתח ראשי, לא כלום.
ב sqlserver יש הרבה יותר סוגים של אינדקסים וכל אחד מהם יכול להיות מוגבל למלא דברים ומלא בהרבה אופציות שונות מבלבד ה"עמודה".
מפתח ראשי עם הפקודה הבאה:
ALTER TABLE Tablename
ADD CONSTRAINT pk_whatever_name PRIMARY KEY(columnName)




3. עוד פעם, השאילת משווה נתונים שאתה נותן לה ב utf-8 לאומת נתונים ששמורים במסד בתור utf-16.
גם לזה אין באמת פתרון, חוץ מלקודד את המחרוזת שאתה עושה לה LIKE לקידוד אחר (utf-16) לפני שאתה שולח אותה למסד.


באופן כללי ריבוי שפות זה לא הצד החזק של sqlserver.
ואם אתה חייב להישתמש בו, תצטרך לעשות הרבה קונבטרציות של קידודים.
אם לא, לך על postgresql ושכח מכל הבעיות האלה.

avatar ענה משתמש_214319 ב 15 למאי 2012 #

תודה על העזרה..

שאלה כזאת.. אולי עדיף להשאיר במסד ג'יבריש ובכל חיבור לעשות המרות לקידוד המתאים?

ניסיתי לעשות ששליפה תתבצע בג'יבריש ואחרי זה תרגום שלה יתבצע דרך הPHP לעברית

echo iconv('UTF-8','windows-1255',$name);


לא ממש הולך .. זה חותך שורות לא מתרגם כמו שצריך .. וצפוי לי עוד הרבה כאב ראש מכל הסיפור הזה..

מה אתה אומר?

תודה

avatar ענה intval ב 15 למאי 2012 #

אני אומר שאם אתה הולך לעבוד עם sqlserver ורק עם עברית (ולא שום שפה אחרת) - אז תעבוד עם ansii
ותשנה את ה collation ל Hebrew_CI_AI ותקודד את הקבצים שאתה מכניס למסד ל Windows-1255 עם iconv.
כנ"ל לגבי קבצי הקוד וההדרים שנשלחים לדפדפן.

avatar ענה משתמש_214319 ב 15 למאי 2012 #

ועוד משהו אני לוקח ג'יבריש מהמסד ומנסה להריץ שאילתה במסד על אותו הטקסט ושימצא אותו וכלום..

avatar ענה משתמש_214319 ב 15 למאי 2012 #

אני מרגיש עכשיו בשנת 2000 עם כל הבעיות תאימות בקידודים ... איזה עולם הזוי!

דבר שני ..שיניתי את הDB ל Hebrew_CI_AI+תאימות קבצים לansi ..

Load מתבצע על 1255 ואפילו אין צורך בקידוד חוזר לUTF8 או ל1255 בקבצי קוד לבצע שליפות

כרגע זה פתרון זמני שעובד.. אני אצטרך לחשוב בהמשך על המרה דרך השרת מTXT UTF8 לקובץ טקסט ANSI ..יש אפשרות כזאת און דה פליי או מצריך פרוצדורה שמטפלת במחרוזות ושומרת עם קידוד אחר??


תודה רבה גבר!

avatar ענה intval ב 15 למאי 2012 #

לפרוצדורה הזו קוראים iconv :)

avatar ענה משתמש_214319 ב 15 למאי 2012 #

ממה שבדקתי הוא משבש מחרוזות מעל גודל מסויים...

אני מכוון לקבצים בגדלי גיגה ומעלה שבכל קובץ מעל 16 מיליון רשומות... לא יעשה בעיה?

דרך אגב לא צריך לבצע קידוד אחרי שליפות ניתן להכניס את זה לקונייקשן סטרינג של הSQL

$connectionInfo = array( "Database"=>"database", "UID"=>"", "PWD"=>"","CharacterSet"=>"UTF-8");

avatar ענה intval ב 15 למאי 2012 #

אפשר לנסות להישתמש גם ב mb_convert_encoding
או בכלל לא לעשות את זה ב PHP אלה בשורת הפקודה ששם אין שום סיבה ש iconv לא יעבוד.
תנסה להוריד איפשהו iconv.exe